﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Net;
//using System.Web.Mvc;
//using System.Web.Routing;
//using Calendar.Logic.Core;
//using Calendar.Logic.ObjectManager;
//using Calendar.Logic.ObjectManager.Authorization;
//using Calendar.Logic.ObjectModel;
//using System.Web.Script.Serialization;
//using Calendar.Logic.ObjectModel.Authorization;
//using Calendar.Web.Core;

//namespace Calendar.Web.Controllers
//{
//    /// <summary>
//    /// Вспомогательная сущность, представляющая событие
//    /// </summary>
//    [Serializable]
//    public class JsonEvent
//    {
//        public JsonEvent()
//        {
//            title = "";
//            start = "";
//            end = "";
//            managers = new Dictionary<string, string>();
//            color = "";
//            mine = "";
//        }

//        // ReSharper disable InconsistentNaming
//        public string title;
//        public string start;
//        public string end;
//        public Dictionary<string, string> managers;
//        public string color;
//        public int id;
//        public string mine;
//        // ReSharper restore InconsistentNaming

//        public static JsonEvent CreateFromEvent(Event e, string userName, bool mine, EventColors? color)
//        {
//            var um = EventUserManager.Instance.SelectByUserAndEvent(userName, e.ID);
//            string rgb;
//            var mySwitch = color == null && um != null ? um.Color : color;
//            switch (mySwitch)
//            {
//                case EventColors.Blue:
//                    rgb = "rgb(164, 189, 252)";
//                    break;
//                case EventColors.Green:
//                    rgb = "rgb(122, 231, 191)";
//                    break;
//                case EventColors.Purple:
//                    rgb = "rgb(219, 173, 255)";
//                    break;
//                case EventColors.Red:
//                    rgb = "rgb(255, 136, 124)";
//                    break;
//                case EventColors.Yellow:
//                    rgb = "rgb(251, 215, 91)";
//                    break;
//                default:
//                    rgb = "rgb(164, 189, 252)";
//                    break;

//            }
//            //var when = um != null && um.WhenNotify > 0 ? um.WhenNotify.ToString() : string.Empty;
//            var when = string.Empty;
//            return new JsonEvent
//            {
//                id = e.ID,
//                title = e.Title,
//                start = String.Format("{0:yyyy-MM-dd HH:mm:ss}", e.Start),
//                end = String.Format("{0:yyyy-MM-dd HH:mm:ss}", e.End),
//                managers = EventUserManager.Instance.SelectManagersByEvent(e.ID),
//                color = rgb,
//                mine = mine.ToString()
//            };
//        }

//    }

//    /// <summary>
//    /// Вспомагательня сущность, представляющая уведомление
//    /// </summary>
//    [Serializable]
//    public struct Notification
//    {
//        public string Title;
//        public int WhenNotify;
//        public bool IsEmailNotify;
//        public Notification(string title, int whenNotify, bool isEmailNotify)
//        {
//            Title = title;
//            WhenNotify = whenNotify;
//            IsEmailNotify = isEmailNotify;
//        }
//    } 

//    [RoleAuthorize(AppRole.Пользователь)]
//    public class TendersScheduleController : Controller
//    {
//        //
//        // GET: /TendersSchedule/
//        private string _user;

//        protected override void Initialize(RequestContext requestContext)
//        {
//            base.Initialize(requestContext);
//            _user = requestContext.HttpContext.User.Identity.Name;
//            var errorMsgs = requestContext.HttpContext.Request.QueryString.GetValues("errorMsg");
//            if (errorMsgs == null) return;
//            foreach (var errorMsg in errorMsgs)
//            {
//                ViewData.ModelState.AddModelError("", errorMsg);
//            }
//        }

//        public ActionResult Index()
//        {
//            RedirectToAction("Calendar");
//        }

//        public ActionResult Calendar()
//        {
//            var events = EventManager.Instance.SelectAllByUser(_user);
//            var jsEvents = events.Select(e => JsonEvent.CreateFromEvent(e, _user, true, null)).ToList();
//            var frendlyEvents = EventManager.Instance.SelectAllFrendlyUser(_user);
//            var frendlyJsEvents = frendlyEvents.Select(e => JsonEvent.CreateFromEvent(e, _user, false, null)).ToList();

//            var jss = new JavaScriptSerializer();
//            ViewBag.Events = jss.Serialize(jsEvents.Union(frendlyJsEvents));
//            return View();
//        }

//        [HttpGet]
//        public ActionResult Create()
//        {
//            return View();
//        }

//        [HttpPost]
//        public ActionResult Create(DateTime start, DateTime end, DateTime? startSignedSpec, DateTime? endSignedSpec, 
//                                    string title, int[] partIds, int[] categoryIds, int[] managerIds,
//                                    int? minutes, int? eventId, string colorEventValue)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();

//            var userId = UserManager.Instance.SelectByName(_user).ID;

//            if (eventId != null)
//            {
//                var ev = EventManager.Instance.SelectById((int)eventId);
//                UpdateModel(ev);
//                var authorId = EventUserManager.Instance.SelectAuthorIdForEvent((int)eventId);
//                try
//                {
//                    //EventUserManager.Instance.EditWhenNotify((int)eventId, userId, whenNotify != null ? whenNotify * minutes : -1);

//                    if (authorId == userId)
//                    {

//                        EventManager.Instance.Edit(ev);
//                        try
//                        {
//                            if (managerIds == null)
//                            {
//                                EventUserManager.Instance.RemoveUsersFromEvent((int)eventId,
//                                                                               EventUserManager.Instance.
//                                                                                   SelectUsersForEventNotAuthor((int)eventId));
//                            }
//                            else
//                            {
//                                var currManagersIds = EventUserManager.Instance.SelectUserIdsByEvent((int)eventId).ToList();
//                                var delIds =
//                                    currManagersIds.Where(id => !managerIds.Contains(id) && id != userId).ToArray();
//                                if (delIds.Count() > 0) EventUserManager.Instance.RemoveUsersFromEvent((int)eventId, delIds);
//                                var addIds = managerIds.Where(id => !currManagersIds.Contains(id)).ToArray();
//                                if (addIds.Count() > 0)
//                                {
//                                    EventUserManager.Instance.AddUsersToEvent((int)eventId, addIds);
//                                    var emailTo = UserManager.Instance.SelectEmailsByIds(addIds);
//                                    EmailManager.Instance.CreateBatch("NoticeAboutNewEvent",
//                                                                      new Dictionary<string, string> { { "EventName", ev.Title } }, emailTo, null);
//                                }
//                            }

//                        }
//                        catch (Exception e)
//                        {

//                        }

 
//                    }


//                    //EventUserManager.Instance.EditWhenNotify((int)eventId, userId, whenNotify * minutes);
//                    EventColors color;
//                    if (Enum.TryParse(colorEventValue, out color))
//                        EventUserManager.Instance.SetColorForUser((int)eventId, userId, color);
//                    if (isAjax)
//                        return
//                            Json(JsonEvent.CreateFromEvent(EventManager.Instance.SelectById((int)eventId), _user, authorId == userId, null));
//                    return RedirectToAction("Calendar");
//                }
//                catch (ManagerException exc)
//                {
//                    if (HttpContext.Request.IsAjaxRequest())
//                    {
//                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                        return Content(exc.Message);
//                    }
//                    ModelState.AddModelError("", exc.Message);
//                    return RedirectToAction("Calendar");
//                }
//                catch (Exception)
//                {
//                    if (HttpContext.Request.IsAjaxRequest())
//                    {
//                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                        return Content("There's an error in your request");
//                    }
//                    return RedirectToAction("Calendar");
//                }
//            }

//            // добавляем новое событие
//            try
//            {
//                var e = EventManager.Instance.CreateInstance(start, end, title);
//                var id = EventManager.Instance.CreateEvent(e);

//                //Отправляем emails
//                if (managerIds != null)
//                {
//                    var emailsTo = UserManager.Instance.SelectEmailsByIds(managerIds);
//                    EmailManager.Instance.CreateBatch("NoticeAboutNewEvent", new Dictionary<string, string> { { "EventName", e.Title } }, emailsTo, null);
//                }
//                managerIds = managerIds != null ? managerIds.Union(new[] { userId }).ToArray() : new[] { userId };
//                EventUserManager.Instance.AddUsersToEvent(id, managerIds);
//                EventUserManager.Instance.SetAuthorForEvent(id, userId);

//                EventColors color;
//                EventUserManager.Instance.SetColorForUser(id, userId,
//                                                          Enum.TryParse(colorEventValue, out color)
//                                                              ? color
//                                                              : EventColors.Blue);
//                if (isAjax)
//                    return Json(JsonEvent.CreateFromEvent(EventManager.Instance.SelectById(id), _user, true, color != null ? color : EventColors.Blue));
//            }
//            catch (ManagerException exc)
//            {
//                if (isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content(exc.Message);
//                }
//                return RedirectToAction("Calendar", new { errorMsg = exc });
//            }

//            return RedirectToAction("Calendar");
//        }


//        [HttpPost]
//        public ActionResult AddNotification(int id, string notificationObject)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();
//            try
//            {
//                var notification = new JavaScriptSerializer().Deserialize<Notification>(notificationObject);
//                int userId = UserManager.Instance.SelectByName(_user).ID;
//                var retult = EventNotificationManager.Instance.AddNotification(id, userId, notification.Title, notification.WhenNotify, notification.IsEmailNotify);
//                if(isAjax)
//                    return Json(retult);
//                return RedirectToAction("Calendar");
//            }
//            catch(ManagerException ex)
//            {
//                if(isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content(ex.Message); 
//                }
//                return RedirectToAction("Calendar", new {errorMsg = ex.Message});
//            }
//        }

//        [HttpPost]
//        public ActionResult RemoveNotification(int id)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();
//            try
//            {
//                var notification = EventNotificationManager.Instance.SelectById(id);
//                if(notification != null && notification.User != UserManager.Instance.SelectByName(_user).ID)
//                {
//                    return Content("Данное уведомление не пренадлежит Вам."); 
//                }

//                EventNotificationManager.Instance.RemoveNotification(id);
//                if (isAjax)
//                    return Json(id);
//                return RedirectToAction("Calendar");
                
//            }
//            catch(ManagerException ex)
//            {
//                if(isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content(ex.Message); 
//                }
//                return RedirectToAction("Calendar", new {errorMsg = ex.Message});
//            }
//        }

//        //[HttpPost]
//        //public ActionResult EditNotification(int id, string notificationObject)
//        //{
//        //    var isAjax = HttpContext.Request.IsAjaxRequest();
//        //    try
//        //    {
//        //        var notification =
//        //            new JavaScriptSerializer().Deserialize<Notification>(notificationObject);
//        //        var notif = EventNotificationManager.Instance.SelectById(id);
//        //        if(notif != null)
//        //        {
//        //            int userId = UserManager.Instance.SelectByName(_user).ID;
//        //            if (notif.User != userId)
//        //            {
//        //                return Content("Данное уведомление не пренадлежит Вам.");
//        //            }
//        //            notif.Title = notification.Title;
//        //            notif.When = notification.WhenNotify;
//        //            notif.IsEmail = notification.IsEmailNotify;
//        //            notif.Sent = false;
//        //            EventNotificationManager.Instance.EditNotification(notif);
//        //            if (isAjax)
//        //                return Json(notif);

//        //        }

//        //        return RedirectToAction("Calendar");
//        //    }
//        //    catch (ManagerException ex)
//        //    {
//        //        if (isAjax)
//        //        {
//        //            Response.StatusCode = (int) HttpStatusCode.BadRequest;
//        //            return Content(ex.Message);
//        //        }
//        //        return RedirectToAction("Calendar", new {errorMsg = ex.Message});
//        //    }
//        //}


//        public ActionResult UpdateEventDate(int id, DateTime start, DateTime end)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();
//            var authorId = EventUserManager.Instance.SelectAuthorIdForEvent(id);
//            var userId = UserManager.Instance.SelectByName(_user).ID;
//            try
//            {
//                var ev = EventManager.Instance.SelectById(id);
//                if(ev != null)
//                {
//                    ev.Start = start;
//                    ev.End = end;
//                    EventManager.Instance.Edit(ev);
//                    if (isAjax)
//                        return
//                            Json(JsonEvent.CreateFromEvent(EventManager.Instance.SelectById(id), _user, authorId == userId, null));
//                    return RedirectToAction("Calendar");
//                }
//                return RedirectToAction("Calendar", new  {errorMsg = "Такого события не существует"});
//            }
//            catch(ManagerException ex)
//            {
//                if (isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content(ex.Message);
//                }
//                return RedirectToAction("Calendar", new { errorMsg = ex.Message });
//            }

//        }


//        [HttpPost]
//        public ActionResult Remove(int id)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();
//            var userId = UserManager.Instance.SelectByName(_user).ID;
//            var evManager = EventUserManager.Instance.SelectAuthorIdForEvent(id);
//            if (userId != evManager || evManager == 0)
//            {
//                if (isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content("Данное событие не принадлежит Вам.");
//                }
//                return RedirectToAction("Calendar", new { errorMsg = "Данное событие не принадлежит Вам." });
//            }
//            try
//            {
//                EventManager.Instance.RemoveEvent(id);
//                if (isAjax)
//                {
//                    return Json(id);
//                }
//                return RedirectToAction("Calendar");
//            }
//            catch (ManagerException ex)
//            {
//                if (isAjax)
//                {
//                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
//                    return Content(ex.Message);
//                }
//                return RedirectToAction("Calendar", new { errorMsg = ex.Message });
//            }
//        }

//        [HttpGet]
//        public ActionResult Edit(int id)
//        {
//            var isAjax = HttpContext.Request.IsAjaxRequest();
//            var ev = EventManager.Instance.SelectById(id);
//            var eventUser = EventUserManager.Instance.SelectByUserAndEvent(_user, id);
//            if (isAjax)
//            {
//                return Json(JsonEvent.CreateFromEvent(EventManager.Instance.SelectById(id), _user, true, eventUser.Color), JsonRequestBehavior.AllowGet);
//            }
//            return View(ev);
//        }

//        [HttpGet]
//        public ActionResult ShowEventInfo(int id)
//        {
//            var ev = EventManager.Instance.SelectById(id);
//            int userId = UserManager.Instance.SelectByName(_user).ID;
//            var evUsers = EventUserManager.Instance.SelectUserIdsByEvent(id);
//            if (ev == null || evUsers == null)
//            {
//                return RedirectToAction("Calendar", new { errorMsg = "Данное событие не принадлежит Вам." });
//            }
//            if (!evUsers.Contains(userId))
//            {
//                return RedirectToAction("Calendar", new { errorMsg = "Данное событие не принадлежит Вам." });
//            }
//            return PartialView("EventInfo", ev);
//        }


//    }

//}